/*********************************************************************\
*
*                  (c) lkc
*                  All Rights Reserved. lkc Confidential
*
\*********************************************************************/
/*********************************************************************\
*   Title                      :
*
*   Module Description         :
*
*   Author                     : lkc
*
*   Created                    : 2018-7-5
*
\*********************************************************************/

#include "Communicate.h"
#include <QTimer>
#include "SerialPortQt.h"
#include "UDPSockQt.h"
#include "ProtocolPC.h"
#include "ProtocolHuaNuo.h"
#include "ProtocolPodXinWang.h"
#include <QThread>
#include <memory>

bool CommInitQt()
{
    int countQt = 0;
#ifdef PC_IS_ALIVE
#ifdef PC_COMM_TYPE_IS_QT
    countQt++;
#endif//POD_COMM_TYPE_IS_QT
#endif//#ifdef PC_IS_ALIVE

#ifdef POD_COMM_TYPE_IS_QT
    countQt++;
#endif//#POD_COMM_TYPE_IS_QT

    if(countQt<=0)
    {
        printf("countQt<=0, no need to CommInitQt\n");
        return true;
    }

    //用于通信的线程
    static QThread comThread;
    QObject::connect(&comThread, &QThread::finished, &comThread, &QObject::deleteLater);

    //PC通信设置
#ifdef PC_IS_ALIVE
#ifdef PC_COMM_TYPE_IS_QT
    //普通指针new了之后必须delete，否则产生野指针。或者也可用static变量的形式。智能指针可以避免这种情况。
    std::shared_ptr<UDPSockQt> commPC = std::make_shared<UDPSockQt>(NET_PORT_PC, &ProtocolPC::GetInstance());//commPC的父对象为ProtocolPC，保证两者在同一个线程中
    if(!(commPC->Open()))
    {
        return false;
    }
    QObject::connect(&(commPC->m_socket),&QSerialPort::readyRead,commPC.get(), &UDPSockQt::ReadAndParse);
    ProtocolPC::GetInstance().SetCommTool(commPC);
    ProtocolPC::GetInstance().moveToThread(&comThread);//新线程
    QObject::connect(&comThread, &QThread::finished, &ProtocolPC::GetInstance(), &QObject::deleteLater);
#endif//#ifdef PC_COMM_TYPE_IS_QT
#endif//#ifdef PC_IS_ALIVE

    //华诺通信设置
#ifdef HUANUO_COMM_TYPE_IS_QT
    //普通指针new了之后必须delete，否则产生野指针。或者也可用static变量的形式。智能指针可以避免这种情况。
    std::shared_ptr<SerialPortQt> commHuaNuo = std::make_shared<SerialPortQt>(DEV_NAME_HUANUO,&ProtocolHuaNuo::GetInstance());//commHuaNuo的父对象为ProtocolHuaNuo，保证两者在同一个线程中
    if(!commHuaNuo->Open())
    {
        return false;
    }
    if(!(commHuaNuo->SetOpt(115200,QSerialPort::NoFlowControl,QSerialPort::Data8,QSerialPort::OneStop,QSerialPort::EvenParity)))
    {
        return false;
    }
    QObject::connect(&(commHuaNuo->m_portSer),&QSerialPort::readyRead,commHuaNuo.get(), &SerialPortQt::ReadAndParse);
    ProtocolHuaNuo::GetInstance().SetCommTool(commHuaNuo);
    ProtocolHuaNuo::GetInstance().moveToThread(&comThread);//新线程
    QObject::connect(&comThread, &QThread::finished, &ProtocolHuaNuo::GetInstance(), &QObject::deleteLater);
#endif //#ifdef HUANUO_COMM_TYPE_IS_QT

    //星网智控通信设置
#ifdef POD_XINWANG_COMM_TYPE_IS_QT
    //普通指针new了之后必须delete，否则产生野指针。或者也可用static变量的形式。智能指针可以避免这种情况。
    std::shared_ptr<SerialPortQt> commPodXinWang = std::make_shared<SerialPortQt>(DEV_NAME_POD_XINWANG,&ProtocolPodXinWang::GetInstance());//commPodXinWang的父对象为ProtocolPodXinWang，保证两者在同一个线程中
    if(!commPodXinWang->Open())
    {
        return false;
    }
    if(!(commPodXinWang->SetOpt(115200,QSerialPort::NoFlowControl,QSerialPort::Data8,QSerialPort::OneStop,QSerialPort::NoParity)))
    {
        return false;
    }
    QObject::connect(&(commPodXinWang->m_portSer),&QSerialPort::readyRead,commPodXinWang.get(), &SerialPortQt::ReadAndParse);
    ProtocolPodXinWang::GetInstance().SetCommTool(commPodXinWang);
    ProtocolPodXinWang::GetInstance().moveToThread(&comThread);//新线程
    QObject::connect(&comThread, &QThread::finished, &ProtocolPodXinWang::GetInstance(), &QObject::deleteLater);
#endif //#ifdef POD_XINWANG_COMM_TYPE_IS_QT


    //信息周期发送
    static QTimer timer40ms;
    static QTimer timer100ms;
#ifdef PC_IS_ALIVE
#ifdef PC_COMM_TYPE_IS_QT
    QObject::connect(&timer40ms, &QTimer::timeout,&ProtocolPC::GetInstance(),&ProtocolPC::CycleSendOnce);
#endif//#ifdef PC_COMM_TYPE_IS_QT
#endif//#ifdef PC_IS_ALIVE

#ifdef HUANUO_COMM_TYPE_IS_QT
    QObject::connect(&timer100ms, &QTimer::timeout,&ProtocolHuaNuo::GetInstance(),&ProtocolHuaNuo::CycleSendOnce);
#endif//#ifdef HUANUO_COMM_TYPE_IS_QT

    comThread.start();
    timer40ms.start(40);
    timer100ms.start(100);

    return true;
}

/********************************************************************\
 *
 * REVISION RECORDS
 *
\*********************************************************************/
/*********************************************************************/
/*
 *
 *
 *
\*********************************************************************/
/*------------------------------The End------------------------------*/
